package com.yociyy.admin.biz;

import java.util.ArrayList;
import java.util.List;

import com.yociyy.admin.mapper.BaseRoleDeptMapper;
import com.yociyy.admin.mapper.BaseRoleMapper;
import com.yociyy.admin.mapper.BaseRoleMenuMapper;
import com.yociyy.admin.mapper.BaseUserRoleMapper;
import com.yociyy.admin.model.entity.BaseRole;
import com.yociyy.admin.model.entity.BaseRoleDept;
import com.yociyy.admin.model.entity.BaseRoleMenu;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.yociyy.admin.model.constant.UserConstants;

import cn.hutool.core.util.ObjectUtil;
import tk.mybatis.mapper.entity.Example;
import tk.mybatis.mapper.weekend.WeekendSqls;

/**
 * 角色信息 biz
 *
 * @author Y.yang
 * @date 2019-12-02
 */
@Service
public class BaseRoleBiz {

	@Autowired
	private BaseRoleMapper roleMapper;

	@Autowired
	private BaseRoleMenuMapper roleMenuMapper;

	@Autowired
	private BaseUserRoleMapper userRoleMapper;

	@Autowired
	private BaseRoleDeptMapper roleDeptMapper;

	/**
	 * 新增角色信息
	 * 
	 * @param role 角色信息
	 * @return 结果
	 */
	public int insertRole(BaseRole role) {
		return roleMapper.insertSelective(role);
	}

	/**
	 * 通过主键id查询角色信息
	 * 
	 * @param id 角色id
	 * @return 角色信息
	 */
	public BaseRole selectRoleByRoleId(long id) {
		return roleMapper.selectByPrimaryKey(id);
	}

	/**
	 * 角色菜单信息关联授权
	 *
	 * @param role 角色关联菜单信息
	 */
	public void saveRolePerms(BaseRole role) {
		// 删除角色与菜单关联
		roleMenuMapper.deleteByExample(Example.builder(BaseRoleMenu.class).where(WeekendSqls.custom().andEqualTo("roleId", role.getId())).build());
		// 批量插入角色菜单关联
		this.insertRoleMenu(role);
	}

	/**
	 * 新增角色菜单关联信息
	 *
	 * @param role 角色对象
	 */
	public int insertRoleMenu(BaseRole role) {
		int rows = 1;
		// 新增用户与角色管理
		List<BaseRoleMenu> list = new ArrayList<BaseRoleMenu>();
		for (Long menuId : role.getMenuIds()) {
			list.add(new BaseRoleMenu().setRoleId(role.getId()).setMenuId(menuId));
		}
		if (list.size() > 0) {
			rows = roleMenuMapper.batchInsertRoleMenu(list);
		}
		return rows;
	}

	/**
	 * 通过角色id计算角色用户关联信息条数
	 * 
	 * @param roleId 角色id
	 * @return 结果
	 */
	public int countRoleUserByRoleId(Long roleId) {
		return userRoleMapper.countUserRoleByRoleId(roleId);
	}

	/**
	 * 删除角色信息
	 *
	 * @param ids 角色id数组
	 * @return 结果
	 */
	public int deleteByIds(long[] ids) {
		return roleMapper.batchDeleteRoleByIds(ids);
	}

	/**
	 * 查询全部角色信息
	 *
	 * @return 角色信息列表
	 */
	public List<BaseRole> selectRoleAll() {
		return roleMapper.selectRoleAll();
	}

	/**
	 * 修改角色信息
	 *
	 * @param role 角色对象
	 * @return 结果
	 */
	public int updateRole(BaseRole role) {
		return roleMapper.updateByPrimaryKeySelective(role);
	}

	/**
	 * 修改数据权限信息
	 *
	 * @param role 角色信息
	 * @return 结果
	 */
	public int saveAuthDataScope(BaseRole role) {
		// 修改角色信息
		updateRole(role);
		// 删除角色与部门关联
		roleDeptMapper.deleteRoleDeptByRoleId(role.getId());
		// 新增角色和部门信息（数据权限）
		return insertRoleDept(role);
	}

	/**
	 * 新增角色部门信息(数据权限)
	 *
	 * @param role 角色对象
	 */
	public int insertRoleDept(BaseRole role) {
		int rows = 1;
		// 新增角色与部门（数据权限）管理
		List<BaseRoleDept> list = new ArrayList<>();
		for (Long deptId : role.getDeptIds()) {
			list.add(new BaseRoleDept().setDeptId(deptId).setRoleId(role.getId()));
		}
		if (list.size() > 0) {
			rows = roleDeptMapper.batchRoleDept(list);
		}
		return rows;
	}

	/**
	 * 校验角色名称是否唯一
	 *
	 * @param role 角色信息
	 * @return 结果
	 */
	public String checkRoleNameUnique(BaseRole role) {
		Long roleId = ObjectUtil.isNull(role.getId()) ? -1L : role.getId();
		BaseRole info = roleMapper.checkRoleNameUnique(role.getRoleName());
		if (ObjectUtil.isNotNull(info) && info.getId().longValue() != roleId.longValue()) {
			return UserConstants.ROLE_NAME_NOT_UNIQUE;
		}
		return UserConstants.ROLE_NAME_UNIQUE;
	}
}